// Copyright (C) 2009 Jesse Jones
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

using System;
using System.IO;
using System.Reflection;

namespace MmmDoc.Html
{
	/// <summary>Abstract class used to generate non-frameset HTML files.</summary>
	internal abstract class WriteNormalHtml : WriteHtml
	{
		protected WriteNormalHtml(string file, string cssFile) : base(file)
		{
			m_cssFile = cssFile;
		}
		
		#region Protected Methods
		protected override void OnCopyFiles(string dir)
		{
			// Write the default css file.
			byte[] data;
			Assembly assembly = Assembly.GetExecutingAssembly();
			using (Stream stream = assembly.GetManifestResourceStream(m_cssFile))
			{
				data = new byte[stream.Length];
				stream.Read(data, 0, (int) stream.Length);
			}
			
			string file = Path.Combine(dir, m_cssFile);
			if (File.Exists(file))
				File.Delete(file);
				
			File.WriteAllBytes(file, data);
			
			// If we have a custom css file then append it onto the default.
			if (!string.IsNullOrEmpty(Settings.CssDir))
			{
				string path = Path.Combine(Settings.CssDir, m_cssFile);
				if (File.Exists(path))
				{
					string contents = string.Empty;
					contents += Environment.NewLine;
					contents += "/* Custom overrides */";
					contents += Environment.NewLine;
					contents += File.ReadAllText(path);
					
					File.AppendAllText(file, contents);
				}
			}
		}
		
		protected override void OnWriteDocumentTypeDeclaration(Writer writer)
		{
			// Can't use strict because we need to use the anchor target attribute
//			writer.UnencodedWrite("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">");
			writer.UnencodedWrite("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
			writer.WriteLine();
		}
		
		protected override void OnWriteHeadContents(Writer writer)
		{
			writer.WriteElementLine("LINK", null, "REL", "StyleSheet", "href", m_cssFile, "type", "text/css");
		}
		
		protected override void OnWriteBody(Writer writer)
		{
			writer.WriteStartTagLine("BODY");
				OnWriteBodyContents(writer);
			writer.WriteEndTagLine("BODY");
		}
		#endregion
		
		#region Fields
		private string m_cssFile;
		#endregion
	}
}
